<html>
    <head>
        <title>当前租户接口  ICurrentTenant</title>
    </head>
    <body>
        <script>
            /*
                  2、当前租户接口 ICurrentTenant

                                               ICurrentTenant是与"多租户基础设施" 交互的主要服务。

                                               ApplicationService、DomainService、AbpController和其他一些基类已经具有预注入的CurrentTenant属性。

                                               对于其他类型的类，您可以将ICurrentTenant注入到您的服务中。


                                               (1)、租户属性

                                                            ICurrentTenant 接口定义了以下属性：

                                                                            ①、Id（Guid）：当前租户的ID。如果当前用户是主机用户或无法从请求中确定租户，则可以为null。

                                                                            ②、Name（string）：当前租户的名称。如果当前用户是主机用户或无法从请求中确定租户，则可以为null。

                                                                            ③、如果Id不是null，则返回true。

                                               (2)、修改当前租户

                                                            BP根据ICurrentTenant.Id自动过滤资源（数据库、缓存…）。

                                                            但是，在某些情况下，您可能希望代表特定租户执行操作，通常是在主机上下文中。

                                                            ICurrentTenant.Change方法将当前租户更改放在有限的作用域中，因此您可以安全地为租户执行操作。

                                                            eg:  获取特定租户的产品计数

                                                                    using System;
                                                                    using System.Threading.Tasks;
                                                                    using Volo.Abp.Domain.Repositories;
                                                                    using Volo.Abp.Domain.Services;

                                                                    namespace MultiTenancyDemo.Products
                                                                    {
                                                                        public class ProductManager : DomainService
                                                                        {
                                                                            private readonly IRepository<Product, Guid> _productRepository;

                                                                            public ProductManager(IRepository<Product, Guid> productRepository)
                                                                            {
                                                                                _productRepository = productRepository;
                                                                            }

                                                                            // 根据前端传来的租户ID，获取该租户的产品数量
                                                                            public async Task<long> GetProductCountAsync(Guid? tenantId)
                                                                            {
                                                                                using (CurrentTenant.Change(tenantId))  // 将租户更改房子放在有限的作用域中，这样可以安全地为租户执行操作
                                                                                {
                                                                                    return await _productRepository.GetCountAsync();
                                                                                }
                                                                            }
                                                                        }
                                                                    }

                                                            Change方法可以以嵌套方式使用。它将CurrentTenant.Id恢复为using语句之后的前一个值。

                                                            当您在Change范围内使用CurrentTenant.Id时，您将获得提供给Change方法的tenantId。

                                                            因此，存储库也会获得这个tenantId并可以相应地过滤数据库查询。

                                                            ★、使用CurrentTenant.Change(null)将范围更改为主机上下文。
            */
        </script>
    </body>
</html>